package cn.bobohost.crmrbac.web.controller;

import cn.bobohost.crmrbac.pojo.po.Department;
import cn.bobohost.crmrbac.pojo.query.QueryObject;
import cn.bobohost.crmrbac.service.DepartmentService;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 部门管理的表现层控制处理
 * controller就是处理请求响应
 */
@Controller
@RequestMapping("/department")
@RequiredArgsConstructor  //必要时生成有参构造器
@Slf4j //lombok的日志注解
public class DepartmentController {

    //基于slf4j日志框架
//    private static final Logger log = LoggerFactory.getLogger(DepartmentController.class);

//    @Autowired
    private final DepartmentService departmentService;

//    @Autowired
//    public DepartmentController(DepartmentService departmentService) {
//        this.departmentService = departmentService;
//    }

    //注入jackson的objectMapper对象
    private final ObjectMapper objectMapper;

    /**
     * 查询所有部门
     * @return   json数据
     */
    @GetMapping("/listall")
    @ResponseBody //将结果转成json，而不是跳转到页面。如果不加，则跳转到页面
    public List listAll(){

//        String userjson=objectMapper.writeValueAsString(user)

        //调用service
        return departmentService.findDepartmentList();
    }
    /**
     *
     * @param model 给页面提升数据的数据模型 注入springmvc提供的数据模型对象
     * @param queryObject 分页查询条件对象,既封装了请求数据，也放请求域的模型对象中了
     * @return
     */
    @RequestMapping("/list")  //什么请求方法都能接收
//    @GetMapping("/list")
    public String list(Model model,@ModelAttribute("qo") QueryObject queryObject){

        log.debug("分页条件数据：｛｝",queryObject);

        //-------方案1：使用mybatisplus自带插件方式

        /*//手动封装page对象
        //参数1：当前页码  参数2：每页最大记录数  ---前端传过来
        IPage page = Page.of(queryObject.getCurrentPage(), queryObject.getPageSize());

        //调用业务层查询数据
        IPage<Department> pageResult= departmentService.findDepartmentListPage(page);


        //重新封装结果数据
        Map<String,Object> pageInfo =new HashMap<>();
        //总页码数
        pageInfo.put("pages",pageResult.getPages());
        pageInfo.put("pageNum",queryObject.getCurrentPage());
        pageInfo.put("list",pageResult.getRecords());


        //向数据模型中放入数据
        model.addAttribute("pageInfo",pageInfo);*/


        //方案2：使用PageHelper（主要还是为了前端）
        //调用业务层查询数据
        PageInfo<Department> pageInfo = departmentService.findDepartmentListPageByPageHelper(queryObject);
        //向数据模型中放入数据
        model.addAttribute("pageInfo",pageInfo);

        //放入qo的对象，使用@ModelAttribute("qo")注解替代了
//        model.addAttribute("qo",queryObject)


        //返回的是一个页面文件地址
        //默认返回的是页面：路径是static或templates为基础路径的路径，不用写扩展名
        //底层：默认配置url 前缀/templates/，后缀html
        return "department/list"; //转发到模版页面
    }

    /**
     * 保存或修改部门
     * @return
     */
    @PostMapping("/saveOrUpdate")
//    @RequestMapping("/saveOrUpdate") //如果是常规form表单提交（get/POST），这里都用@RequestMapping ！！！！！
    //添加shiro的权限注解
//    @RequiresRoles("Admin_MGR")//当前方法绑定了一个角色
    @RequiresRoles({"Admin_MGR","Market_Manager"})//当前方法绑定了一组角色，只要用户的角色权限匹配到一个即可。
    public String saveOrUpdate(Department department){

        //代码级别shiro权限控制，粒度最细，一般不用
//        try {
//            SecurityUtils.getSubject().checkRole("Admin_MGR");
//            //有权限
//        } catch (AuthorizationException e) {
//            throw new RuntimeException(e);
//            //没有权限
//        }


        //打印数据到控制台--硬打印---不太适合调试--一定打印
        System.out.println("部门信息："+department);
        //日志调试
        log.debug("部门信息(debug)：{}",department);
        log.info("部门信息(info)：{}",department);




        //调用业务层
        departmentService.saveOrUpdateDepartment(department);

        //再次返回列表，并刷新列表
        return "redirect:/department/list"; //重定向到服务的请求路径
        /*
        重定向：响应302状态码和一个Location的头信息给浏览器，浏览器会自动get请求头信息后面的地址



        页面跳转分为两种：转发+重定向
        转发：原页面保留，成为历史记录（可以回退），打开新的页面
        重定向：关闭原页面，无历史记录（可以回退），打开新页面，页面参数什么的都重置
         */

    }


    @RequestMapping("/delete")
    public String delete(@RequestParam("id") Integer id){

        //调用业务层
        departmentService.removeById(id);


        //返回列表的Controller，让其重新加载列表数据
        return "redirect:/department/list";
    }

}
